package cn.tedu.mall.order.service.imp;

import cn.tedu.mall.common.exception.CoolSharkServiceException;
import cn.tedu.mall.common.pojo.domain.CsmallAuthenticationInfo;
import cn.tedu.mall.common.restful.JsonPage;
import cn.tedu.mall.common.restful.ResponseCode;
import cn.tedu.mall.order.mapper.OmsCartMapper;
import cn.tedu.mall.order.service.IOmsCartService;
import cn.tedu.mall.pojo.order.dto.CartAddDTO;
import cn.tedu.mall.pojo.order.dto.CartUpdateDTO;
import cn.tedu.mall.pojo.order.model.OmsCart;
import cn.tedu.mall.pojo.order.vo.CartStandardVO;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class OmsCartServiceImpl implements IOmsCartService {

    @Autowired
    private OmsCartMapper omsCartMapper;

    @Override
    public void addCart(CartAddDTO cartDTO) {
        // 获取当前登录用户的userId
        Long userId = getUserId();
        // 判断这个userId的用户是否已经将指定的sku添加到购物车
        OmsCart omsCartExits = omsCartMapper.selectExitsCart(userId, cartDTO.getSkuId());
        if (omsCartExits != null) {
            // 如果sku已经存在于购物车中,就修改这个sku在购物车中的数量
            omsCartExits.setQuantity(omsCartExits.getQuantity()+cartDTO.getQuantity());
            // 执行数据库修改
            omsCartMapper.updateQuantityById(omsCartExits);
        } else {
            // 如果sky没有存在于购物车中,就新增sku信息到购物车
            OmsCart omsCartNew = new OmsCart();
            // 将cartDTO对象中的同名属性赋值给 新创建的OmsCart对象
            BeanUtils.copyProperties(cartDTO,omsCartNew);
            // OmsCart对象中赋值当前登录用户id
            omsCartNew.setUserId(userId);
            // 新增新增
            omsCartMapper.saveCart(omsCartNew);

        }
    }

    @Override
    public JsonPage<CartStandardVO> listCarts(Integer page, Integer pageSize) {
        // 获取用户id
        Long userId = getUserId();
        // 设置查询页码和每页条数
        PageHelper.startPage(page,pageSize);
        // 查询
        List<CartStandardVO> list = omsCartMapper.selectCartByUserId(userId);
        // 实例化PageInfo
        PageInfo pageInfo = new PageInfo(list);
        return JsonPage.restPage(pageInfo);

    }

    @Override
    public void removeCart(Long[] ids) {
        int rows = omsCartMapper.deleteCartById(ids);
        if (rows == 0){
            throw new CoolSharkServiceException(ResponseCode.NOT_FOUND,"购物车中没有商品");
        }
        log.debug("删除了{}件商品",rows);
    }

    @Override
    public void removeAllCarts() {
        // 获取用户id
        Long userId = getUserId();
        int rows = omsCartMapper.deleteCartByUserId(userId);
        if (rows == 0){
            throw new CoolSharkServiceException(ResponseCode.NOT_FOUND,"购物车中没有商品");
        }
        log.debug("删除了{}件商品",rows);
    }

    @Override
    public void removeUserCarts(OmsCart omsCart) {
        // 根据omsCart中的userId和skuId删除购物车
        omsCartMapper.deleteCartByUserIdAndSkuId(omsCart);
    }

    @Override
    public void updateQuantity(CartUpdateDTO cartUpdateDTO) {
        OmsCart omsCart = new OmsCart();
        // 将cartUpdateDTO赋值给mosCart
        BeanUtils.copyProperties(cartUpdateDTO,omsCart);
        omsCartMapper.updateQuantityById(omsCart);
    }



    // 业务逻辑层中可能有多个方法需要获取当前用户信息
    /**
     * 从SpringSecurity中获取用户信息
     * @return 用户信息
     */
    public CsmallAuthenticationInfo getUserInfo(){
        // 从SpringSecurity框架容器中,获得当前用户的authenticationToken对象
        UsernamePasswordAuthenticationToken authenticationToken =
                (UsernamePasswordAuthenticationToken) SecurityContextHolder
                        .getContext().getAuthentication();
        // 判断获取的对象是不是null
        if (authenticationToken != null){
            CsmallAuthenticationInfo csmallAuthenticationInfo =
                    (CsmallAuthenticationInfo) authenticationToken.getCredentials();
            return csmallAuthenticationInfo;
        }
        throw new CoolSharkServiceException(ResponseCode.UNAUTHORIZED,"没有登录信息");
    }

    /**
     * 单纯获取当前登录对象的id
     * @return
     */
    public Long getUserId(){
        Long userId = getUserInfo().getId();
        return userId;
    }
}
